//【字符串】
//javascript 中的 string 类型用于表示文本型的数据
/**
 * string 字面量
 * 可以使用单引号或双引号创建简单的字符串：
 * "foo";
 * "bar";
 */

/**
 * 16 进制转义序列
 * \x 之后的数值将被认为是一个 16 进制数
 * "\xA9"; // "©"
 */

/**
 * Unicode 转义序列
 * Unicode 转义序列在\u 之后需要至少 4 个字符。
 * "\u00A9"; // "©"
 */

/**
 * unicode 字元逸出
 * 这是 ECMAScript 6 中的新特性。有了 Unicode 字元逸出，任何字符都可以用 16 进制数转义
 * 这使得通过 Unicode 转义表示大于0x10FFFF的字符成为可能
 * 示例：
 * "\u{2F804}";
 *
 * //简单的Unicode转义也是如此
 * "\uD87E\uDC04";
 */

/**
 * 字符串对象
 * string 对象是对原始 string 类型的封装
 * 示例：
 * const foo = new String("foo"); // 创建一个 String 对象
 * console.log(foo); // 输出：[String: 'foo']
 * typeof foo; // 返回 'object'
 */

/**
 * 除非必要应该尽量使用 string 字面值，因为 string 对象的某些行为可能并不与直觉一致
 * 示例：
 * const firstString = "2 + 2"; //创建一个字符串字面量
 * const secondString = new String("2 + 2"); // 创建一个字符串对象
 * eval(firstString); // 返回数字 4
 * eval(secondString); // 返回包含 "2 + 2" 的字符串对象
 *
 * String 对象有一个属性 length，标识了字符串中 UTF-16 的码点个数。
 *下面的代码把 13 赋值给了helloLength，因为 "Hello, World!" 包含 13 个字符，每个字符用一个 UTF-16 码点表示：
 *
 * const hello = "Hello, World!";
 * const helloLength = hello.length;
 * hello[0] = "L"; // 无效，因为字符串是不变的
 * hello[0]; // 返回 "H"
 */

/**
 * 多行
 * 源代码中插入的任何新行开始字符都作为模板字符串的内容
 * 使用一般的字符串时，为了创建多行的字符串不得不用如下语法：
 * console.log(
 *   "string text line 1\n\
 * string text line 2",
 * );
 * // "string text line 1
 * // string text line 2"
 *
 * 为了实现同样效果的多行字符串，现在可以写成如下形式：
 * console.log(`string text line 1
 * string text line 2`);
 * // "string text line 1
 * // string text line 2"
 */

/**
 * 嵌入表达式
 * 为了在一般的字符串中嵌入表达式，需要使用如下语法：
 * const five = 5;
 * const ten = 10;
 * console.log(
 *   "Fifteen is " + (five + ten) + " and not " + (2 * five + ten) + ".",
 * );
 * // "Fifteen is 15 and not 20."
 *
 * 现在，使用模板字符串，可以使用语法糖让类似功能的实现代码更具可读性：
 * const five = 5;
 * const ten = 10;
 * console.log(`Fifteen is ${five + ten} and not ${2 * five + ten}.`);
 * // "Fifteen is 15 and not 20."
 */
//【国际化】
/**
 * Intl 对象是 ECMAScript 国际化 API 的命名空间，它提供了语言敏感的字符串比较，数字格式化和日期时间格式化功能
 * Collator, NumberFormat, 和 DateTimeFormat 对象的构造函数是Intl对象的属性
 */

/**
 * 日期和时间格式化
 * DateTimeFormat 对象在日期和时间的格式化方面很有用
 * 下面的代码把一个日期格式化为美式英语格式 (不同时区结果不同.)
 * // July 17, 2014 00:00:00 UTC:
 * const july172014 = new Date("2014-07-17");
 *
 * const options = {
 *   year: "2-digit",
 *   month: "2-digit",
 *   day: "2-digit",
 *   hour: "2-digit",
 *   minute: "2-digit",
 *   timeZoneName: "short",
 * };
 * const americanDateTime = new Intl.DateTimeFormat("en-US", options).format;
 *
 * // 本地时区会根据你的设置而有所不同。
 * // 在 CEST（中欧夏令时）中，输出：07/17/14, 02:00 AM GMT+2。
 * // 在 PDT（太平洋夏令时）中，输出：07/16/14, 05:00 PM GMT-7。
 * console.log(americanDateTime(july172014));
 */

/**
 * 数字格式化
 * NumberFormat 对象在数字的格式化方面很有用，比如货币数量值
 * 示例：
 * var gasPrice = new Intl.NumberFormat("en-US", {
 *   style: "currency",
 *   currency: "USD",
 *   minimumFractionDigits: 3,
 * });
 *
 * console.log(gasPrice.format(5.259)); // $5.259
 *
 * var hanDecimalRMBInChina = new Intl.NumberFormat("zh-CN-u-nu-hanidec", {
 *   style: "currency",
 *   currency: "CNY",
 * });
 *
 * console.log(hanDecimalRMBInChina.format(1314.25)); // ￥ 一，三一四。二五
 */

/**
 * 定序
 * Collator 对象在字符串比较和排序方面很有用。
 *
 * 德语中有两种不同的排序方式phonebook和dictionary.
 * var names = ["Hochberg", "Hönigswald", "Holzman"];
 *
 * var germanPhonebook = new Intl.Collator("de-DE-u-co-phonebk");
 *
 * // as if sorting ["Hochberg", "Hoenigswald", "Holzman"]:
 * console.log(names.sort(germanPhonebook.compare).join(", "));
 * // logs "Hochberg, Hönigswald, Holzman"
 */